Deep Learning: Image Captioning

Notebook on Kaggle: https://www.kaggle.com/simonstaehli/image-captioniong-flickr8k-pytorch

Data

Beschreibung:

Das Bild zeigt einige Beispielbilder mit den dazugehörigen Captions. Pro Bild gibt es grundsätzlich 5 verschiedene Captions.

Der Datensatz mit den Captions kann als CSV eingelesen werden. Pro Bild exisiteren mehrere Captions.

Generate Train-Validate-Test

Preprocess Text-Data

Beschreibung:

Man kann hier eine Long-Tail Distribution sehen, die über eine starke Rechtsschiefe verfügt. Diese Rechtssschiefe ist ein Zeichen dafür, dass die meisten Wörter wenige Wordcounts haben, wobei es vereinzelte Wörter gibt die sehr oft vorkommen und die Verteilung so in die breite ziehen. Bei diesem Beispiel habe ich eine Logtransformation angewendet um zu schauen. Man kann die grösste Dichte über $10^0=1$ sehen. Die meisten Wörter im Datensatz kommen also genau einmal vor.

Beschreibung:

Auc hier kann man die Rechtsshiefe Form der oberen Verteilung bereits erkennen. Dabei sieht man dass Füllwörter und Präppositionen an erster Stelle auftauchen, was auch so zu erwarten war. Sehr interessant sind Wörter die danach auftauche wie: man, Two, black, woman, girl etc. Dies gibt bereits einen kleinen Aufschluss darüber was auf den Bildern mehrheitlih zu sehen ist. Ein Entfernen der oft vorkommenden Wörter macht denke ich nicht viel sinn, da diese Wörter gebraucht werden, um anständige Sätze zu bilden. Bei den oftvorkommenden Wörtern kann man erkennen, dass zB sehr of die Wörter dog, man, boy, woman etc vorkommen. Dies könnte unter Umständen schlecht für das Modell sein, wenn die Bilder mehrheitlich aus "Objekten" besteht.

Im rechten Plot sind die seltensten Wörter zu sehen, die sich natürlich im Plot stets unterscheiden, da alle meistens nur einmal auftauchen. Die Wörter sind wurden sehr selten zur Beschreibung der Bilder gebraucht. Daher ist daraus zu schliessen, dass diese Bilder nur einmal im Datensatz auftauchen. Es könnte durchaus sinn machen die wenigvorkommenden Wörter zu löschen, da vermutlich die Datengrundlage zu klein ist, um hier ein Modell anzulernen. Ich werde somit Wörter entfernen die nur einmal vorkommen.

Wir sehen, dass wir sehr viele Wörter haben, die nur einmal in den Daten vorkommen, deshalb möchte ich diese Wörter mit dem Tag UNK kennzeichnen, da die Datenmenge für jene zu klein ist um passend angelernt zu werden. Ein Vorteil hierbei ist auch die Reduktion der Datenmenge.

Beschreibung:

Man kann sehen, dass die meisten Längen eher Normalverteilt sind mit Mittelwert um 10. Es hat einige Satzlängen, die sehr lange sind und als Ausreisser bezeichnet werden können. Ich denke, dass es sinn macht diese Sätze zu reduzieren oder auch zu entfernen in unserem Datensatz. Vorerst werde ich diese Grösse jedoch beibehalten.

Tokenizer Test

Wie man an dieser Aussage sehen kann wurde das Neue Wort, dass noch nicht in den Daten drinnen war als <UNK> gekennzeichnet, was die Abk. unbekannt kennzeichnet.

Loading Data

Modellierung

Der Trainingsprozess wurde in separate Notebooks ausgelagert, aufgrund der GPU-Nutzung. Deshalb importiere ich hier nur die trainierten Modelle. Das Notebook kann auf Kaggle gefunden werden und zwar -> hier

Die beiden Plots zeigen die Entwicklung der Kosten über Epochen und Batches hinweg. Der stärkste Abstieg der Kostenfunktion kann in den ersten Epochen beobachtete werden, danach eher abflachend, da auch mit einem Learning-Rate Scheduler gearbeitet wurde.

Das Modell mit dem vortranierten CNN-Encoder wurde auf mehreren Epochen traininert. Die Kurven der Netzwerkarchitekturen sehen ähnlich aus. Auch das Niveau der Kostenfunktion nach 20 Epochen scheint ähnlich zu sein.

Sampling Images

Beschreibung:

Das Netzwerk, welches nicht mit einem vorgelernten CNN-Netwerk trainiert wurde, retourniert Vorhersagen, die oftmals keinen Sinn ergeben. Das Netzwerk kann nicht erkennen, was genau auf dem Bild zu erkennen ist. In den Beispielen werden vor allem Hunde gut erkannt, was daran liegen könnte, dass der Datensatz über sehr viele Hundebilder verfügt. Vor allem Attribute, die Kleidung oder Farben beschreiben werden sehr schlecht erkannt und beschrieben.

Beschreibung:

Das mit Transfer-Learning trainierte Netzwerk erkennt viel besser, was auf einem Bild zu sehen ist, sprich die Objekte auf einem Bild. Das Netzwerk verwechselt hier und da den Kontext des Bildes, doch liefert weitaus bessere Ergebnisse als die Architektur mit dem trainierten CNN-Encoder.

BLEU-Evaluation

Beschreibung:

Wenn beide Durchschnittlichen Resultate verglichen werden, dann erzielt das vortrainierte Netzwerk bessere Resultate im Sinne des BLEU über alle N-Gramme hinweg. Auch in Anbetracht der Verteilungen sind durchaus mehrere Werte grösser als 0 und zeigen somit etwas mehr Übereinstimmung der generierten Token mit den wirklichen Token.

Es erzielen jedoch beide Netzwerke viele schlechte Resultate desto grösser man die N-Gramme wählt zur Berechnung des BLEU-Scores, sprich schlechte Captions im Vergleich mit den Soll-Captions, was anhand der vielen Nullwerte zu sehen ist. Dieses Resultat ist jedoch plausibel, da längere Kontext für ein Modell generell schwieriger zu treffen ist.

Anwendung auf Eigene Bilder

Beschreibung:

Die Bilder wurden von der Webseite Unsplash.com heruntergeladen, danach mit dem gleichen Pre-processing überarbeitet, mit welchem das Modell trainiert wurde.

Man sieht auch hier wieder den Unterschied zwsichen beiden Modellen. Das Untere Modell erkennt Objekte besser, wobei bei beiden Modellen meistens die Farbgebung sehr schlecht erkannt werden. Ein Grund dafür könnte das Pre-Processing der Bilder sein.

Die Captions wurden auf einem spezifischen Datensatz trainiert und man sieht, dass das Modell nicht auf irgendwelche Daten anwendbar ist, die nicht aus dem urpsrüunglichen Datensatz entspringen. Ich nehme an, als man die Samples aus dem Flickr8k Datensatz gezogen hat, hat man spezifiche Bildklassen in den Fokus gesetzt. Grundsätzlich erkennt vor allem das untere Modell meistens das grundlegende Objekt im Bild, doch der Kontext des Bildes wird dann nicht richtig beschrieben. Meine Auswahl der Bilder könnte deshalb ein wenig Off-Topic erscheinen und dennoch interessant, welche Caption das Modell für diese Bilder ausgibt.

Fazit

Ich denke, in dem ich den Bleu-Score oder eine passende Evaluation noch in den Trainingsprozess miteingebunden hätte, dann hätte ich das Modell besser trainineren und dementsprechend auf bisher ungesehene Daten generalisieren können. Es kann gut sein, dass das Modell bereits zu stark auf den Datensatz gefittet wurde und daher auch oftmals Hunde erkannt werden, obwohl gar keine Hunde im Bild zu sehen sind. Die Netzwerke, die ich hier trainiert habe, erreichen bei weitem nicht die Performances wie sie bspw. Patel et al. (p.5, 2019) erreicht haben siehe BLEU-3: 29.08 mit ähnlicher Architektur. Natürlich hätte man hier auch noch einige Hyperparameter verändern können und schauen, wie es sich auf das Resultat auswirkt. Auch ich habe noch die Annahme getätigt, dass durch das Pre-processing der Bilder die eigentliche Farbgebung verzerrt wird, was es womöglich schwiergier machen könnte für ein Modell die Farben zu erkennen. Oftmals ordnet das Modell die falschen Farben zu.

Sources

Automatic Image Captioning Using Deep Learning. (2018, April 2). Analytics Vidhya. https://www.analyticsvidhya.com/blog/2018/04/solving-an-image-captioning-task-using-deep-learning/

Image Captioning Example Doubt in input size of Decoder LSTM - vision. (2018, März 3). PyTorch Forums. https://discuss.pytorch.org/t/image-captioning-example-doubt-in-input-size-of-decoder-lstm/14296

Ulyanin, S. (2019, Februar 23). Captioning Images with PyTorch. Medium. https://medium.com/@stepanulyanin/captioning-images-with-pytorch-bc592e5fd1a3 Vinyals, O., Toshev, A., Bengio, S., & Erhan, D. (2015). Show and Tell: A Neural Image Caption Generator. arXiv:1411.4555 [cs]. http://arxiv.org/abs/1411.4555

Word Embeddings: Encoding Lexical Semantics—PyTorch Tutorials 1.10.1+cu102 documentation. (o. J.). Abgerufen 17. Januar 2022, von https://pytorch.org/tutorials/beginner/nlp/word_embeddings_tutorial.html

Patel, A., & Varier, A. (2020). Hyperparameter Analysis for Image Captioning. arXiv:2006.10923 [cs]. http://arxiv.org/abs/2006.10923